用邻接链表和队列实现拓扑排序

5 篇文章 0 订阅

之前写拓扑排序是通过邻接矩阵写的,应对小的数据量还可以,但要是顶点数很大时,开的邻接矩阵就未免太大了.今天学习了用邻接表实现拓扑排序,比较简单,所幸,写完后一遍编译通过 + 一遍AC.

**描述**
给出一个图的结构,输出其拓扑排序序列,要求在同等条件下,编号小的顶点在前

**输入**
若干行整数,第一行有2个数,分别为顶点数v和弧数a,接下来有a行,每一行有2个数,分别是该条弧所关联的两个顶点编号

**输出**
若干个空格隔开的顶点构成的序列(用小写字母)



**样例输入**
6 8
1 2
1 3
1 4
3 2
3 5
4 5
6 4
6 5

**样例输出**
v1 v3 v2 v6 v4 v5
//用邻接链表实现拓扑排序
#include <iostream>
#include <queue>
#include <cstdio>
using namespace std;

struct node//邻接表里的每个元素是一个结构体
{
    int num;
    node *next;
    node(){
        next = NULL;
    }
    node(int x):num(x){
        next = NULL;
    }
};

struct list
{
    int num;
    node *next;
    void append(node *&a)
    {
        a->next = next;//将a插到表头里去
        next = a;
    }
}point[2000];

int v, a;//顶点数,边数
int from, to;
int vis[2000], indeg[2000];

int main()
{
    queue<int> q;
    scanf("%d%d",&v,&a);
    while(a--)
    {
        scanf("%d%d",&from,&to);
        indeg[to]++;
        node *tmp = new node(to);
        point[from].append(tmp);//连接有向图
    }
    for(int i=1;i<=v;i++)
        if(indeg[i] == 0)
        {
            q.push(i);
            vis[i] = 1;
            break;
        }
    while(! q.empty())
    {
        int temp = q.front();
        q.pop();
        printf("v%d ",temp);
        node *t = point[temp].next;
        while(t)
        {
            indeg[t->num]--;
            t = t->next;
        }
        for(int i=1;i<=v;i++)//要求从小到大输出,所以每次从小到大遍历
            if(indeg[i]==0 && vis[i]==0)
            {
                vis[i] = 1;
                q.push(i);
                break;
            }
    }
    return 0;
}
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值